import { message } from 'antd';

/**
 * 处理API错误响应，将errors字段中的详细错误信息显示给用户
 * @param error API错误对象
 * @param defaultMessage 默认错误消息
 */
export const handleApiError = (error: any, defaultMessage: string = '操作失败') => {
  console.error('API错误:', error);
  
  const errorData = error?.response?.data;
  
  if (errorData?.errors && typeof errorData.errors === 'object') {
    // 处理字段级别的错误
    const errorMessages: string[] = [];
    
    Object.keys(errorData.errors).forEach(field => {
      const fieldErrors = errorData.errors[field];
      if (Array.isArray(fieldErrors)) {
        // 如果是数组，合并所有错误信息
        fieldErrors.forEach(err => {
          errorMessages.push(`${getFieldDisplayName(field)}: ${err}`);
        });
      } else if (typeof fieldErrors === 'string') {
        // 如果是字符串，直接添加
        errorMessages.push(`${getFieldDisplayName(field)}: ${fieldErrors}`);
      }
    });
    
    if (errorMessages.length > 0) {
      // 显示所有错误信息
      errorMessages.forEach(msg => {
        message.error(msg);
      });
      return;
    }
  }
  
  // 如果没有详细错误信息，显示通用消息
  const displayMessage = errorData?.message || defaultMessage;
  message.error(displayMessage);
};

/**
 * 获取字段的显示名称（中文）
 * @param fieldName 字段名
 * @returns 中文显示名称
 */
const getFieldDisplayName = (fieldName: string): string => {
  const fieldNameMap: Record<string, string> = {
    // 用户相关字段
    username: '用户名',
    email: '邮箱',
    password: '密码',
    password_confirm: '确认密码',
    real_name: '真实姓名',
    phone: '手机号',
    old_password: '原密码',
    new_password: '新密码',
    new_password_confirm: '确认新密码',
    
    // 通用字段
    name: '名称',
    title: '标题',
    description: '描述',
    content: '内容',
    status: '状态',
    
    // 其他常用字段
    non_field_errors: '表单',
    detail: '详情',
  };
  
  return fieldNameMap[fieldName] || fieldName;
};

/**
 * 简化版错误处理函数，只显示主要错误信息
 * @param error API错误对象
 * @param defaultMessage 默认错误消息
 */
export const handleApiErrorSimple = (error: any, defaultMessage: string = '操作失败') => {
  console.error('API错误:', error);
  
  const errorData = error?.response?.data;
  const displayMessage = errorData?.message || defaultMessage;
  message.error(displayMessage);
};

/**
 * 获取格式化的错误信息字符串（不显示message，只返回字符串）
 * @param error API错误对象
 * @param defaultMessage 默认错误消息
 * @returns 格式化的错误信息字符串
 */
export const getFormattedErrorMessage = (error: any, defaultMessage: string = '操作失败'): string => {
  const errorData = error?.response?.data;
  
  if (errorData?.errors && typeof errorData.errors === 'object') {
    const errorMessages: string[] = [];
    
    Object.keys(errorData.errors).forEach(field => {
      const fieldErrors = errorData.errors[field];
      if (Array.isArray(fieldErrors)) {
        fieldErrors.forEach(err => {
          errorMessages.push(`${getFieldDisplayName(field)}: ${err}`);
        });
      } else if (typeof fieldErrors === 'string') {
        errorMessages.push(`${getFieldDisplayName(field)}: ${fieldErrors}`);
      }
    });
    
    if (errorMessages.length > 0) {
      return errorMessages.join('\n');
    }
  }
  
  return errorData?.message || defaultMessage;
};
